package models;

import java.util.*;

import javax.persistence.*;

import play.data.validation.*;
import play.db.jpa.*;

@Entity
public class Stage extends Model{

	public Date dateFinancier;
	
	public Date datePedagogique;
	
	@ManyToOne
	public Agent organisateur;
	
	@Required
	public String code;

	@Required
	@ManyToOne (cascade=CascadeType.ALL)
	public Intitule intitule;

	@Required
	@ManyToOne (cascade=CascadeType.ALL)
	public Nature nature;

	public String modalites;

	@Column(columnDefinition = "TEXT")
	public String description;

	@Required
	@ManyToOne(cascade=CascadeType.ALL)
	public Groupement structure;

	@Required
	@ManyToOne
	public DureeStage duree;

	@ManyToOne(cascade=CascadeType.ALL)
	public EtatStage etat;

	public Date dateDeb;

	public Date dateFin;

	public Date dateExam;

	@Required
	public Integer effectifMin;

	@Required
	public Integer effectifMax;

	@OneToOne
	public Agent directeur;

	@OneToOne
	public Agent gestionnaireAdmin;

	@OneToMany(cascade=CascadeType.ALL)
	public List<Candidat> candidatures;

	public List<Candidat> getCandidatures(){
		return candidatures;
	}
	
	@ManyToOne
	public CIS cis;

	public void setCandidatures(List<Candidat> candid){
		candidatures=candid;
	}

	public Stage(String code,Intitule intitule, Nature nature, Groupement structure, int effectifMin, int effectifMax,
			String modalites, String description, EtatStage etat, DureeStage duree, Date dateDeb, Date dateFin, 
			Date dateExam, Agent directeur, Agent gestionnaireAdmin, CIS cis){
		this.cis=cis;
		this.intitule = intitule;
		this.etat = etat;
		this.dateDeb = dateDeb;
		this.dateFin = dateFin;
		this.dateExam=dateExam;
		this.directeur = directeur;
		this.structure = structure;
		this.gestionnaireAdmin = gestionnaireAdmin;
		this.structure=structure;
		this.description=description;
		this.nature=nature;
		this.duree=duree;
		this.effectifMin=effectifMin;
		this.effectifMax=effectifMax;
		this.modalites = modalites;
		this.code=code;
		candidatures=new ArrayList<Candidat>();
	}

	public void addCandidature(Candidat candidat){
		candidatures.add(candidat);
	}

	public String toString(){
		return intitule.toString();
	}

	public boolean equals(Stage s){
		return s.getCode()==this.getCode();
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public boolean contientCandidat(Candidat c){
		Iterator<Candidat> it=candidatures.iterator();
		while(it.hasNext()){
			Candidat cand=it.next();
			if(cand.equals(c) && (cand.role.equals(c.role)||cand.role.getNom().equals("Stagiaire"))){	
			return true;		
			}
			if(cand.equals(c) && (c.role.getNom().equals("Stagiaire")) && (cand.role.getNom().equals("Jury")||cand.role.getNom().equals("Formateur"))){	
				return true;		
			}
		}
		return false;
	}

	public int getEffectif(){
		int effectif = 0;
		Iterator<Candidat> it=this.candidatures.iterator();
		while(it.hasNext()){
			Candidat cand=it.next();
			if((cand.role.getNom().equals("Stagiaire") && cand.etatCandid.nom.equals("Validée")) && !cand.candidPartielle){
				effectif++;
			}
		}
		  return effectif;
	}
	
	public int getEffectifListeAttente(){
		int effectif = 0;
		Iterator<Candidat> i = this.candidatures.iterator();
		while(i.hasNext()){
			Candidat c = i.next();
			if(c.role.getNom().equals("Stagiaire") && c.etatCandid.nom.equals("Liste d'attente")){
				effectif++;
			}
		}
		return effectif;
	}
	
	public int getEffectifAnnule(){
		int effectif = 0;
		Iterator<Candidat> i = this.candidatures.iterator();
		while(i.hasNext()){
			Candidat c = i.next();
			if(c.role.getNom().equals("Stagiaire") && c.etatCandid.nom.equals("Annulée")){
				effectif++;
			}
		}
		return effectif;
	}
	
	public int getNombreJury(){
	  int effectif = 0;
		Iterator<Candidat> i = this.candidatures.iterator();
		while(i.hasNext()){
			Candidat c = i.next();
			if(c.role.getNom().equals("Jury") && c.etatCandid.nom.equals("Validée")){
				effectif++;
			}
		}
		return effectif;
	}
	public int getNombreFormateur(){
	  int effectif = 0;
		Iterator<Candidat> i = this.candidatures.iterator();
		while(i.hasNext()){
			Candidat c = i.next();
			if(((c.role.nom.equals("Conducteur") || c.role.nom.equals("Formateur")) || c.role.nom.equals("Aide Form.")) && c.etatCandid.nom.equals("Validée")){
				effectif++;
			}
		}
		return effectif;
	}
	
	public Integer getEffectifMax(){
		return effectifMax;
	}
	
}
